﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace PProtocolo
{
    public class ProtocoloCliente : Protocolo
    {

        public void ListarArchivosREQ()
        {
            Trama trama = new Trama();
            trama.Comando=50;
            trama.Header=Protocolo.Tipo.REQ;
            trama.Datos="";
            trama.Largo=0;
            EnviarTrama(trama);
        }

        public void EnviarArchivoREQ(String nombre, long tamanio)
        {

                Trama trama = new Trama();
                trama.Comando = 40;
                trama.Header = Protocolo.Tipo.REQ;
                trama.Datos = nombre + "|" + tamanio.ToString();
                trama.Largo = trama.Datos.Length;
                EnviarTrama(trama);
            
        }

        public void DescargarArchivoREQ(String nombre)
        {
            Trama trama = new Trama();
            trama.Comando = 60;
            trama.Header = Protocolo.Tipo.REQ;
            trama.Datos = nombre;
            trama.Largo = trama.Datos.Length;
            EnviarTrama(trama);
        }

        public long DescargarArchivoRES()
        {
            long tamanio = -1;

            Trama trama = RecibirTrama();
            
            if(trama.Comando == 62)//el archivo existe
            {
                long.TryParse(trama.Datos, out tamanio);
            }

            return tamanio;
        }

        public void DescargarArchivoRESContenido(string nombre, long tamanio)
        {
            RecibirArchivoContenidoRES(tamanio, nombre, Tipo.RES, 61);
        }

        

        public void EnviarArchivoRES(string ruta, long tamanio)
        {
            
            Trama trama = RecibirTrama();
            if (ValidarDato(trama, Tipo.RES, 40))
            {
                EnviarArchivoContenidoREQ(ruta, tamanio, Tipo.REQ, 41);
            }
            else
            {
                Console.WriteLine("Protocolo:ProtocoloCliente.EnviarArchivoRES: El dato recibido por el servidor para el archivo no fue correcto. Se ignorará.");
            }
        }

        public ArrayList ListarArchivosRES()
        {
            Trama trama = RecibirTrama();
         
            ArrayList retorno = new ArrayList();

            if (ValidarDato(trama, Tipo.RES, 50))
            {
                int cantidadArchivos = 0;

                int.TryParse(trama.Datos, out cantidadArchivos);

                if (cantidadArchivos > 0)
                {
                    for (int i = 0; i < cantidadArchivos; i++)
                    {
                        Trama archivoTrama = RecibirTrama();
                        //Console.WriteLine("Recibi la trama " + trama.Header);
                        //Console.WriteLine("Recibi el comando " + trama.Comando.ToString());
                        if (ValidarDato(archivoTrama, Tipo.RES, 51))
                        {
                            retorno.Add(archivoTrama.Datos);
                        }
                        else
                        {
                            Console.WriteLine("Protocolo:ProtocoloCliente.ListarArchivosRES: El dato recibido por el servidor para el archivo no fue correcto. Se ignorará.");
                        }
                        
                    }
                }
            }
            else
            {
                Console.WriteLine("Protocolo:ProtocoloCliente.ListarArchivosRES: La respuesta enviada por el servidor no fue correcta.");
            }
            
            return retorno;

        }

        public void SincronizarREQ(string ip, int puerto)
        {
            Thread.Sleep(100);
            Trama trama = new Trama();
            trama.Header = Tipo.REQ;
            trama.Comando = 70;
            trama.Datos = ip + "|" + puerto.ToString();
            trama.Largo = trama.Datos.Length;
            EnviarTrama(trama);
        }

        public int SincronizarRES()
        {
            Thread.Sleep(500);
            Trama trama = RecibirTrama();
            
            return trama.Comando;

        }

        public string ObtenerIdSesion()
        {
            Trama trama = RecibirTrama();
            if (ValidarDato(trama, Tipo.RES, 81))
            {
                return trama.Datos;
            }
            return "";
        }

        public void EliminarArchivo(String nombre)
        {
            Trama trama = new Trama();
            trama.Comando = 90;
            trama.Header = Protocolo.Tipo.REQ;
            trama.Datos = nombre;
            trama.Largo = trama.Datos.Length;
            EnviarTrama(trama);
        }

        public void Desconectar()
        {
            Trama trama = new Trama();
            trama.Comando = 0;
            trama.Header = Protocolo.Tipo.REQ;
            trama.Datos = "";
            trama.Largo = trama.Datos.Length;
            EnviarTrama(trama);
        }

    }
}
